package iot_hmbirdthing

// IDataSpec 数据类型:
//
//	int（原生）、
//	float（原生）、
//	double（原生）、
//	text（原生）、
//	date（String类型UTC毫秒）、
//	bool（0或1的int类型）、
//	enum（枚举项定义方法与bool类型定义0和1的值方法相同）、
//	struct（结构体类型，可包含前面7种类型，下面使用 "specs":[{}]描述包含的对象）、
//	array（数组类型，支持int、double、float、text、struct）
type IDataSpec interface {
	TypeName() string
	Copy() IDataSpec
}

var DataSpecList = []IDataSpec{
	&IntData{},
	&FloatData{},
	&DoubleData{},
	&TextData{},
	&EnumData{},
	&BoolData{},
	&ArrayData{},
	&StructData{},
}

type FloatData struct {
	Min      string `json:"min"`      //参数最小值（int、float、double类型特有）
	Max      string `json:"max"`      //参数最大值（int、float、double类型特有）
	Step     string `json:"step"`     //步长（int、float、double类型特有）
	Unit     string `json:"unit"`     //属性单位（int、float、double类型特有，非必填）,如 %
	UnitName string `json:"unitName"` //单位名称（int、float、double类型特有，非必填）,如 百分比
}

func (d FloatData) TypeName() string {
	return "float"
}

func (d FloatData) Copy() IDataSpec {
	return &FloatData{}
}

type IntData struct {
	Min      string `json:"min"`      //参数最小值（int、float、double类型特有）
	Max      string `json:"max"`      //参数最大值（int、float、double类型特有）
	Step     string `json:"step"`     //步长（int、float、double类型特有）
	Unit     string `json:"unit"`     //属性单位（int、float、double类型特有，非必填）,如 %
	UnitName string `json:"unitName"` //单位名称（int、float、double类型特有，非必填）,如 百分比
}

func (d IntData) TypeName() string {
	return "int"
}

func (d IntData) Copy() IDataSpec {
	return &IntData{}
}

type DoubleData struct {
	Min      string `json:"min"`      //参数最小值（int、float、double类型特有）
	Max      string `json:"max"`      //参数最大值（int、float、double类型特有）
	Step     string `json:"step"`     //步长（int、float、double类型特有）
	Unit     string `json:"unit"`     //属性单位（int、float、double类型特有，非必填）,如 %
	UnitName string `json:"unitName"` //单位名称（int、float、double类型特有，非必填）,如 百分比
}

func (d DoubleData) TypeName() string {
	return "double"
}

func (d DoubleData) Copy() IDataSpec {
	return &DoubleData{}
}

type TextData struct {
	Length int `json:"length"`
}

func (d TextData) TypeName() string {
	return "text"
}

func (d TextData) Copy() IDataSpec {
	return &TextData{}
}

// DateData date（String类型UTC毫秒）
type DateData struct {
}

func (d DateData) TypeName() string {
	return "date"
}

func (d DateData) Copy() IDataSpec {
	return &DateData{}
}

// BoolData （0或1的int类型）、
type BoolData map[string]string

func (d BoolData) TypeName() string {
	return "bool"
}

func (d BoolData) Copy() IDataSpec {
	return &BoolData{}
}

// EnumData enum（枚举项定义方法与bool类型定义0和1的值方法相同）
// 示例： {"type":"enum","specs":"{\"1\":\"enum1\",\"2\":\"enum2\",\"3\":\"enum3\"}"}
type EnumData map[string]string

func (d EnumData) TypeName() string {
	return "enum"
}

func (d EnumData) Copy() IDataSpec {
	return &EnumData{}
}

// StructData （结构体类型，可包含前面7种类型，下面使用 "specs":[{}]描述包含的对象）、
type StructData []StructItemData

type StructItemData struct {
	Code     string            `json:"code"`
	Name     string            `json:"name"`
	TypeSpec ThingDataTypeSpec `json:"typespec"`
}

func (d StructData) TypeName() string {
	return "struct"
}

func (d StructData) Copy() IDataSpec {
	return &StructData{}
}

// ArrayData （数组类型，支持int、double、float、text、struct）
type ArrayData struct {
	Size  int       `json:"size"`
	Type  string    `json:"type"`
	Specs IDataSpec `json:"specs"`
}

func (d ArrayData) TypeName() string {
	return "array"
}

func (d ArrayData) Copy() IDataSpec {
	return &ArrayData{}
}

func (d ArrayData) Parse() interface{} {
	return &ArrayData{}
}
